package com.itstyle.seckill.topic.jichu;

/**
 * @Auther: liuwenxiang
 * @Date: 2020/4/14 21:59
 * @Description:
 *
 * 注意：
 * 1.thread1.interrupt()，Thread.interrupted()，thread1.isInterrupted()
 *      --第一个是操作线程中断(只是设置标示位，不会马上中断线程)，第二个是返回标识位，并清除标识位，第三个检查中断标示位。
 *
 * 2.可以通过"中断"唤醒"阻塞"(wait/sleep/join)的方法。
 *      --阻塞方法，被中断，在抛出异常前，会先清除中断位。所有就算该线程被中断了，中断标示位还是false。
 * 3.停止线程
 *        设置flag标示
 *        通过中断位判断--这种方式在对于阻塞线程会失效，因为阻塞线程会失去中断位
 *
 * public void run() {
 *     try {
 *         // 1. isInterrupted()保证，只要中断标记为true就终止线程。
 *         while (!isInterrupted()) {
 *             // 执行任务...
 *         }
 *     } catch (InterruptedException ie) {
 *         // 2. InterruptedException异常保证，当InterruptedException异常产生时，线程被终止。
 *     }
 * }
 * ————————————————
 * 版权声明：本文为CSDN博主「华山拎壶冲」的原创文章，遵循 CC 4.0 BY-SA 版权协议，转载请附上原文出处链接及本声明。
 * 原文链接：https://blog.csdn.net/tyrroo/article/details/91413098
 * 参考：https://blog.csdn.net/tyrroo/article/details/91413098
 */
public class IntruptTest {
    /**
     *
     * interrupt()中断方法
     * Thread.interrupted() 和 Thread.current.isInterrupted()都能够用于检测对象的“中断标记”。
     * 区别是，interrupted()除了返回中断标记之外，它还会清除中断标记(即将中断标记设为false)；而isInterrupted()仅仅返回中断标记。
     * @param args
     */

    public static void main(String[] args) {

        Thread thread1 = new Thread(new test1());
        thread1.start();
        System.out.println("a"+thread1.isInterrupted());
        thread1.interrupt();//
        System.out.println("b"+thread1.isInterrupted());
        Thread thread2 = new Thread(new test2());
        thread2.start();
        System.out.println("c"+thread2.isInterrupted());
        thread2.interrupt();
        System.out.println("d"+thread2.isInterrupted());

    }



    static class test1 implements Runnable{

        /**
         * interrupt()的作用是中断本线程。
         * 本线程中断自己是被允许的；其它线程调用本线程的interrupt()方法时，会通过checkAccess()检查权限。这有可能抛出SecurityException异常。
         * 如果本线程是处于阻塞状态：调用线程的wait(), wait(long)或wait(long, int)会让它进入等待(阻塞)状态，
         * 或者调用线程的join(), join(long), join(long, int), sleep(long), sleep(long, int)也会让它进入阻塞状态。若线程在阻塞状态时，
         * 调用了它的interrupt()方法，那么它的“中断状态”会被清除并且会收到一个InterruptedException异常。例如，线程通过wait()进入阻塞状态，此时通过interrupt()中断该线程；
         * 调用interrupt()会立即将线程的中断标记设为“true”，但是由于线程处于阻塞状态，所以该“中断标记”会立即被清除为“false”，同时，会产生一个InterruptedException的异常。
         * 如果线程被阻塞在一个Selector选择器中，那么通过interrupt()中断它时；线程的中断标记会被设置为true，并且它会立即从选择操作中返回。
         * 如果不属于前面所说的情况，那么通过interrupt()中断线程时，它的中断标记会被设置为“true”。
         * 中断一个“已终止的线程”不会产生任何操作
         * ————————————————
         *

         */
        @Override
        public void run() {
            try {
                Thread.sleep(10000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }


    static class test2 implements Runnable{

        @Override
        public void run() {
            while(1==1){

            }
        }
    }


    static class test3 implements Runnable{

        @Override
        public void run() {
            try{
                while(true){
                    //....
                    Thread.sleep(10);
                }
            }catch (InterruptedException e){
                e.printStackTrace();
            }
        }
    }



}
